package glpm

import (
	"context"
	"fmt"
	"os/exec"
	"strings"
)

// BaseManager 基础包管理器实现
type BaseManager struct {
	name          string
	config        *ManagerConfig
	commandPath   string
}

// NewBaseManager 创建基础包管理器
func NewBaseManager(name string, config *ManagerConfig) *BaseManager {
	return &BaseManager{
		name:        name,
		config:      config,
		commandPath: "",
	}
}

// Name 返回包管理器名称
func (bm *BaseManager) Name() string {
	return bm.name
}

// IsAvailable 检查包管理器是否可用
func (bm *BaseManager) IsAvailable() bool {
	if bm.commandPath != "" {
		return true
	}
	
	path, err := exec.LookPath(bm.name)
	if err != nil {
		return false
	}
	
	bm.commandPath = path
	return true
}

// buildCommand 构建执行命令
func (bm *BaseManager) buildCommand(args ...string) *exec.Cmd {
	var cmdArgs []string
	
	// 如果需要sudo权限
	if bm.config.Sudo {
		cmdArgs = append(cmdArgs, "sudo")
	}
	
	cmdArgs = append(cmdArgs, bm.name)
	cmdArgs = append(cmdArgs, args...)
	
	if bm.config.Sudo {
		return exec.Command("sudo", append([]string{bm.name}, args...)...)
	}
	
	return exec.Command(bm.name, args...)
}

// executeCommand 执行命令并返回输出
func (bm *BaseManager) executeCommand(ctx context.Context, args ...string) (string, error) {
	cmd := bm.buildCommand(args...)
	
	output, err := cmd.CombinedOutput()
	if err != nil {
		return "", NewError(bm.name, strings.Join(args, " "), err)
	}
	
	return string(output), nil
}

// executeCommandWithOutput 执行命令并返回详细结果
func (bm *BaseManager) executeCommandWithOutput(ctx context.Context, args ...string) (string, string, error) {
	cmd := bm.buildCommand(args...)
	
	var stdout, stderr strings.Builder
	cmd.Stdout = &stdout
	cmd.Stderr = &stderr
	
	err := cmd.Run()
	if err != nil {
		return stdout.String(), stderr.String(), NewError(bm.name, strings.Join(args, " "), err)
	}
	
	return stdout.String(), stderr.String(), nil
}

// DefaultInstall 默认安装实现
func (bm *BaseManager) DefaultInstall(ctx context.Context, packages []string) error {
	return fmt.Errorf("包管理器 %s 不支持安装操作", bm.name)
}

// DefaultRemove 默认移除实现
func (bm *BaseManager) DefaultRemove(ctx context.Context, packages []string) error {
	return fmt.Errorf("包管理器 %s 不支持移除操作", bm.name)
}

// DefaultUpdate 默认更新实现
func (bm *BaseManager) DefaultUpdate(ctx context.Context) error {
	return fmt.Errorf("包管理器 %s 不支持更新操作", bm.name)
}

// DefaultUpgrade 默认升级实现
func (bm *BaseManager) DefaultUpgrade(ctx context.Context, packages []string) error {
	return fmt.Errorf("包管理器 %s 不支持升级操作", bm.name)
}

// DefaultSearch 默认搜索实现
func (bm *BaseManager) DefaultSearch(ctx context.Context, pattern string) ([]PackageInfo, error) {
	return nil, fmt.Errorf("包管理器 %s 不支持搜索操作", bm.name)
}

// DefaultInfo 默认信息获取实现
func (bm *BaseManager) DefaultInfo(ctx context.Context, packageName string) (*PackageInfo, error) {
	return nil, fmt.Errorf("包管理器 %s 不支持信息获取操作", bm.name)
}

// DefaultListInstalled 默认列出已安装包实现
func (bm *BaseManager) DefaultListInstalled(ctx context.Context) ([]PackageInfo, error) {
	return nil, fmt.Errorf("包管理器 %s 不支持列出已安装包操作", bm.name)
}

// DefaultIsInstalled 默认检查安装状态实现
func (bm *BaseManager) DefaultIsInstalled(ctx context.Context, packageName string) (bool, error) {
	return false, fmt.Errorf("包管理器 %s 不支持检查安装状态操作", bm.name)
}

// parsePackageInfo 解析包信息（基础实现，子类可以重写）
func (bm *BaseManager) parsePackageInfo(output string) ([]PackageInfo, error) {
	// 基础实现返回空列表，具体包管理器需要实现自己的解析逻辑
	return []PackageInfo{}, nil
}

// parseSinglePackageInfo 解析单个包信息
func (bm *BaseManager) parseSinglePackageInfo(output string) (*PackageInfo, error) {
	// 基础实现返回空信息，具体包管理器需要实现自己的解析逻辑
	return &PackageInfo{}, nil
}